#include "bsp_tim.h"

TIM_HandleTypeDef Fan_PWM_TIM_Handle;
/* 延时 定时器初始化 */
void Delay_TIM_Init(void)
{
    // 使能 TIM2 时钟
    RCC->APB1ENR |= RCC_APB1ENR_TIM2EN;

    // 配置预分频器，实现 1MHz 计数频率
    TIM2->PSC = 72 - 1; // 72MHz / 72 = 1MHz

    // 设置计数器模式为向上计数
    TIM2->CR1 &= ~TIM_CR1_DIR;

    // 设置自动重载值为最大值
    TIM2->ARR = 0xFFFFFFFF;

    // 清除更新标志位
    TIM2->SR &= ~TIM_SR_UIF;

    // 使能定时器
    TIM2->CR1 |= TIM_CR1_CEN;
}
// 微秒级延时(使用TIM2)
void Delay_us(uint32_t us)
{
    uint32_t tickstart = TIM2->CNT;
    while((TIM2->CNT - tickstart) < us);
}

// 毫秒级延时(基于Delay_us)
void Delay_ms(uint32_t ms)
{
    while(ms--)
    {
        Delay_us(1000);
    }
}
/* 风扇PWM 调速定时器 */
void Fan_PWM_TIM_Init(void)
{   
    Fan_PWM_GPIO_Init(); // 初始化 GPIO
    PWM_TIMx_CLK_ENABLE(); // 使能定时器时钟
    Fan_PWM_TIM_Handle.Instance = PWM_TIMx; // 选择定时器 TIM3
    Fan_PWM_TIM_Handle.Init.Prescaler = 72 - 1; // 72MHz / 72 = 1MHz
    Fan_PWM_TIM_Handle.Init.Period = 1000-1;
    Fan_PWM_TIM_Handle.Init.CounterMode = TIM_COUNTERMODE_UP; // 向上计数模式
    Fan_PWM_TIM_Handle.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; // 自动重载
    HAL_TIM_PWM_Init(&Fan_PWM_TIM_Handle); // 初始化 PWM 定时器
    // 配置 PWM 通道
    TIM_OC_InitTypeDef sConfigOC = {0};
    sConfigOC.OCMode = TIM_OCMODE_PWM1; // PWM 模式1
    sConfigOC.Pulse = 0; // 初始占空比 0%
    sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; // 高电平有效
    sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; // 不使用快速模式
    HAL_TIM_PWM_ConfigChannel(&Fan_PWM_TIM_Handle, &sConfigOC, PWM_CHANNELx); // 配置通道1
    HAL_TIM_PWM_Start(&Fan_PWM_TIM_Handle, PWM_CHANNELx); // 启动 PWM 通道1
}